﻿using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace MebApp.Launcher
{
    public class AppIconHelper
    {
        /// <summary>  

        /// 依据文件名读取图标，若指定文件不存在，则返回空值。    

        /// </summary>  

        /// <param name="fileName">文件路径</param>  

        /// <param name="isLarge">是否返回大图标</param>  

        /// <returns></returns>  

        public static Icon GetIconByFileName(string fileName, bool isLarge = true)
        {

            int[] phiconLarge = new int[1];

            int[] phiconSmall = new int[1];

            //文件名 图标索引   

            ExtractIconEx(fileName, 0, phiconLarge, phiconSmall, 1);

            IntPtr IconHnd = new IntPtr(isLarge ? phiconLarge[0] : phiconSmall[0]);
            if (IconHnd == IntPtr.Zero)
                return null;
            return Icon.FromHandle(IconHnd);

        }
        /// <summary>    

        /// 根据文件扩展名（如:.*），返回与之关联的图标。  

        /// 若不以"."开头则返回文件夹的图标。    

        /// </summary>    

        /// <param name="fileType">文件扩展名</param>    

        /// <param name="isLarge">是否返回大图标</param>    

        /// <returns></returns>    

        public static Icon GetIconByFileType(string fileType, bool isLarge)
        {

            if (fileType == null || fileType.Equals(string.Empty)) return null;



            RegistryKey regVersion = null;

            string regFileType = null;

            string regIconString = null;

            string systemDirectory = Environment.SystemDirectory + "\\";



            if (fileType[0] == '.')
            {

                //读系统注册表中文件类型信息    

                regVersion = Registry.ClassesRoot.OpenSubKey(fileType, true);

                if (regVersion != null)
                {

                    regFileType = regVersion.GetValue("") as string;

                    regVersion.Close();

                    regVersion = Registry.ClassesRoot.OpenSubKey(regFileType + @"\DefaultIcon", true);

                    if (regVersion != null)
                    {

                        regIconString = regVersion.GetValue("") as string;

                        regVersion.Close();

                    }

                }

                if (regIconString == null)
                {

                    //没有读取到文件类型注册信息，指定为未知文件类型的图标    

                    regIconString = systemDirectory + "shell32.dll,0";

                }

            }

            else
            {

                //直接指定为文件夹图标    

                regIconString = systemDirectory + "shell32.dll,3";

            }

            string[] fileIcon = regIconString.Split(new char[] { ',' });

            if (fileIcon.Length != 2)
            {

                //系统注册表中注册的标图不能直接提取，则返回可执行文件的通用图标    

                fileIcon = new string[] { systemDirectory + "shell32.dll", "2" };

            }

            Icon resultIcon = null;

            try
            {

                //调用API方法读取图标    

                int[] phiconLarge = new int[1];

                int[] phiconSmall = new int[1];

                uint count = ExtractIconEx(fileIcon[0], Int32.Parse(fileIcon[1]), phiconLarge, phiconSmall, 1);

                IntPtr IconHnd = new IntPtr(isLarge ? phiconLarge[0] : phiconSmall[0]);

                resultIcon = Icon.FromHandle(IconHnd);

            }

            catch { }

            return resultIcon;

        }
        [DllImport("shell32.dll")]
        public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);
    }
}
